package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompFindOrden;
import pe.com.cotelasa.scp.controlador.backingBean.BKGuiaDeRemision;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioDetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@SuppressWarnings("serial")
@Named(value = "MBCompFindOrden")
@Scope("request")
public class MBCompFindOrden extends MBGenerico implements ISubject, Serializable {

    private static Logger logger = Logger.getLogger(MBGuiaDeRemision.class);
    @Inject
    private BKCompFindOrden bkCompFindOrden;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioOrdenCompraServicio ordenCompraServicio;
    @Inject
    private IServicioDetalleOrdenCompraServicio detOrdenCS;
    @Autowired
    BKSession session;

    public void cargarCombo(String inNroOrden) {
        try {
            bkCompFindOrden.setListaOrdenCompraOrServicio(new ArrayList<OrdenCompraServicio>());
            bkCompFindOrden.setIdTipoOrdenFind(null);
            bkCompFindOrden.setListarTipoOrden(servicioParametro
                    .listarTipoOrdenActivos());
            bkCompFindOrden
                    .setListaOrdenCS(ordenCompraServicio.listarOrdenCompraServicioPorNroOrden(inNroOrden, String
                    .valueOf(OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.getValor()), session.getEmpresa().getId()));
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void storeOrdenCSPorTipo() {
        String tipoOC = bkCompFindOrden.getIdTipoOrdenFind();
        bkCompFindOrden.setNroOrdenCSCurrent("");
        bkCompFindOrden.getListaNroOrdenCS().clear();
        listaStoreOrdenCSPorTipo(tipoOC, bkCompFindOrden.getListaOrdenCS(), bkCompFindOrden.getListaNroOrdenCS());
    }

    public void listaStoreOrdenCSPorTipo(String tipoOC, Collection<OrdenCompraServicio> listaOrdenCS,
            Collection<String> listaNroOrdenCS) {
        if (tipoOC.equalsIgnoreCase("C")) {
            for (OrdenCompraServicio item : listaOrdenCS) {
                if (item.getTipo() == 'C') {
                    listaNroOrdenCS.add(item.getCodigo());
                }
            }
        } else {
            if (tipoOC.equalsIgnoreCase("S")) {
                for (OrdenCompraServicio item : listaOrdenCS) {
                    if (item.getTipo() == 'S') {
                        listaNroOrdenCS.add(item.getCodigo());
                    }
                }
            }
        }
    }

    public List<String> buscarNroOrdenCS(String nroOrdenCS) {
        List<String> results = new ArrayList<String>();
        for (String item : bkCompFindOrden.getListaNroOrdenCS()) {
            if (item.startsWith(nroOrdenCS)) {
                results.add(item);
            }
        }
        return results;
    }

    public void buscarOrdenCS() {
        String tipoOC = bkCompFindOrden.getIdTipoOrdenFind();
        String nroOrden = bkCompFindOrden.getNroOrdenCSCurrent();
        bkCompFindOrden.getListaOrdenCompraOrServicio().clear();
        if (tipoOC == null || tipoOC.trim().equalsIgnoreCase("")) {
            bkCompFindOrden.getListaOrdenCompraOrServicio().addAll(bkCompFindOrden.getListaOrdenCS());
        } else {
            /*if(nroOrden != null && !nroOrden.equals("")){
             bkCompFindOrden.getListaOrdenCompraOrServicio().clear();
             for (OrdenCompraServicio  item: bkCompFindOrden.getListaOrdenCS()) {
             if(item.getCodigo().equalsIgnoreCase(nroOrden)){
             bkCompFindOrden.getListaOrdenCompraOrServicio().add(item);
             break;
             }
             }
             }else{*/

            if (tipoOC.equalsIgnoreCase("C")) {
                for (OrdenCompraServicio item : bkCompFindOrden.getListaOrdenCS()) {
                    if (item.getTipo() == 'C') {
                        bkCompFindOrden.getListaOrdenCompraOrServicio().add(item);
                    }
                }
            } else {
                if (tipoOC.equalsIgnoreCase("S")) {
                    for (OrdenCompraServicio item : bkCompFindOrden.getListaOrdenCS()) {
                        if (item.getTipo() == 'S') {
                            bkCompFindOrden.getListaOrdenCompraOrServicio().add(item);

                        }
                    }
                }
            }
            //}			
        }
    }

    @Override
    public void addObserver(IObserver observador) {
        bkCompFindOrden.addObservers(observador);
    }

    @Override
    public void notificarObservadores() {
        try {
            for (IObserver observer : bkCompFindOrden.getObservers()) {
                observer.actualizarObservador(detOrdenCS.listarDetallesPorOrden(bkCompFindOrden.getOrdenCSCurrent()));
            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }
}
